using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
namespace AppManagement.MainManagers
{
	#region using
	using DevComponents.DotNetBar;
	using AppManagement.Models;
	using AppManagement.Repositories;
	using AppManagement.Helpers;
	using System.Data;
	using System.Drawing;
	using System.IO;
	#endregion

	public partial class FrmQuanLySinhVien : Office2007Form
	{
		public EventHandler Handler { get; set; }
		private DevComponents.DotNetBar.Controls.TextBoxX txtMaCN;
		private DevComponents.DotNetBar.Controls.TextBoxX txtMaHDT;
		private DevComponents.DotNetBar.Controls.TextBoxX txtMaKH;
        private int MaKhoa = -1;
        private string MSSV;
        private SinhVien m_SinhVien;

		public FrmQuanLySinhVien(string makhoa, bool enableChon = false, string mssv = "")
		{
			InitializeComponent();
			btnChon.Enabled = enableChon;
            if (makhoa != string.Empty)
            {
                this.MaKhoa = int.Parse(makhoa);
            }
            MSSV = mssv;
		}

		private void FrmQuanLySinhVien_Load(object sender, EventArgs e)
		{
			InitGridView();
			InitHiddenFields();

            if (MSSV != string.Empty)
            {
                m_SinhVien = SinhVienRepository.SelectByID(MSSV);
                LoadDetailInfo(m_SinhVien);
                btnThem.Enabled = false;
                btnReset.Enabled = false;
                btnXoa.Enabled = false;
            }
            else
            {
                cbxGioiTinh.SelectedIndex = 0;
                cbxKyTucXa.SelectedIndex = 1;
            }
            LoadData();
            dtgvData.ClearSelection();
		}

		private void btnChon_Click(object sender, EventArgs e)
		{
			var errorText = "";
			if (!ValidateInput(EnumUpdateMode.CHOOSING, ref errorText))
			{
				MessageBox.Show(errorText, "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
				return;
			}
			var id = txtMSSV.Text;
			var name = SinhVienRepository.SelectByID(id).HoTen;
			TransferDataInfo(this, new TransferSimpleDataEvent(id + "#" + name));
		}

		private void btnThem_Click(object sender, EventArgs e)
		{
			var errorText = "";
			if (!ValidateInput(EnumUpdateMode.INSERT, ref errorText))
			{
				MessageBoxEx.Show(errorText, "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
				return;
			}
			if (ActionAdd())
			{
				MessageBoxEx.Show("Lưu dữ liệu thành công", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
				LoadData();
				btnReset_Click(sender, e);
			}
			else
			{
				MessageBoxEx.Show("Lưu dữ liệu thất bại", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
			}
		}

		private void btnXoa_Click(object sender, EventArgs e)
		{
			var errorText = "";
			if (!ValidateInput(EnumUpdateMode.DELETE, ref errorText))
			{
				MessageBoxEx.Show(errorText, "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
				return;
			}
			if (MessageBoxEx.Show("Bạn có chắc chắn xóa dòng này không?", "Xóa", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
			{
				if (ActionDelete())
				{
					MessageBoxEx.Show("Xóa dữ liệu thành công", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
					LoadData();
					btnReset_Click(sender, e);
				}
				else
				{
					MessageBoxEx.Show("Xóa dữ liệu thất bại", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
				}
			}
		}

		private void btnCapNhat_Click(object sender, EventArgs e)
		{
			var errorText = "";
			if (!ValidateInput(EnumUpdateMode.UPDATE, ref errorText))
			{
				MessageBoxEx.Show(errorText, "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
				return;
			}
			if (ActionUpdate())
			{
				MessageBoxEx.Show("Cập nhật dữ liệu thành công", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
				LoadData();
			}
			else
			{
				MessageBoxEx.Show("Cập nhật dữ liệu thất bại", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
			}
		}

		private void btnReset_Click(object sender, EventArgs e)
		{
			txtMSSV.Text = "";
			txtMaCN.Text = "";
			txtChuyenNganh.Text = "";
			txtMaHDT.Text = "";
			txtHeDaoTao.Text = "";
			txtMaKH.Text = "";
			txtKhoaHoc.Text = "";
			txtHoTen.Text = "";
			dtNgaySinh.Value = DateTime.MinValue;
			txtNoiSinh.Text = "";
			cbxGioiTinh.SelectedIndex = -1;
			txtHKTT.Text = "";
			cbxKyTucXa.SelectedIndex = -1;
			ptbAnh.Image = null;
		}

		private void dtgvData_CellClick(object sender, DataGridViewCellEventArgs e)
		{
			if (dtgvData.SelectedRows == null || dtgvData.SelectedRows.Count == 0)
				return;
			var selectedItem = dtgvData.SelectedRows[0];
			txtMSSV.Text = dtgvData.SelectedRows[0].Cells["MSSV"].Value.ToString();
            var item = SinhVienRepository.SelectByID(txtMSSV.Text);
			LoadDetailInfo(item);
		}

		public void LoadDetailInfo(SinhVien item)
		{
            txtMSSV.Text = item.MSSV;
			txtMaCN.Text = item.MaCN == null ? "" : item.MaCN.ToString();
			txtChuyenNganh.Text = item.ChuyenNganh == null ? "" : item.ChuyenNganh.TenCN.ToString();
			txtMaHDT.Text = item.MaHDT == null ? "" : item.MaHDT.ToString();
			txtHeDaoTao.Text = item.HeDaoTao == null ? "" : item.HeDaoTao.TenHDT.ToString();
			txtMaKH.Text = item.MaKH == null ? "" : item.MaKH.ToString();
			txtKhoaHoc.Text = item.KhoaHoc == null ? "" : item.KhoaHoc.TenKH.ToString();
			txtHoTen.Text = item.HoTen == null ? "" : item.HoTen.ToString();
			dtNgaySinh.Value = item.NgaySinh == null ? DateTime.MinValue : item.NgaySinh.Value;
			txtNoiSinh.Text = item.NoiSinh == null ? "" : item.NoiSinh.ToString();
			cbxGioiTinh.SelectedIndex = item.GioiTinh == null ? -1 : (item.GioiTinh.Value ? 0 : 1);
			txtHKTT.Text = item.HKTT == null ? "" : item.HKTT.ToString();
			cbxKyTucXa.SelectedIndex = item.KyTucXa == null ? -1 : (item.KyTucXa.Value ? 0 : 1);
			if (item.Anh!= null)
			{
				try
				{
					Image newImage;
					using (MemoryStream ms = new MemoryStream(item.Anh, 0, item.Anh.Length))
					{
						ms.Write(item.Anh, 0, item.Anh.Length);
						newImage = Image.FromStream(ms, true);
					}
					ptbAnh.Image = newImage;
				}
				catch (Exception ex)
				{
					MessageBox.Show(ex.ToString());
				}
			}
		}

		private void InitGridView()
		{
			DataGridViewTextBoxColumn objColumn = new DataGridViewTextBoxColumn
			{
				HeaderText = "MSSV",
				DataPropertyName = "MSSV",
				Name = "MSSV",
				Width = (int)((dtgvData.Width - dtgvData.RowHeadersWidth)*((double)1/5))
			};
			dtgvData.Columns.Add(objColumn);
            objColumn = new DataGridViewTextBoxColumn
            {
                HeaderText = "Họ Tên",
                DataPropertyName = "HoTen",
                Name = "HoTen",
                Width = (int)((dtgvData.Width - dtgvData.RowHeadersWidth) * ((double)1 / 5)) 
            };
            dtgvData.Columns.Add(objColumn);
			objColumn = new DataGridViewTextBoxColumn
			{
				HeaderText = "Chuyên ngành",
				DataPropertyName = "TenCN",
                Name = "TenCN",
				Width = (int)((dtgvData.Width - dtgvData.RowHeadersWidth)*((double)1/5))
			};
			dtgvData.Columns.Add(objColumn);
			objColumn = new DataGridViewTextBoxColumn
			{
				HeaderText = "Hệ đào tạo",
				DataPropertyName = "TenHDT",
                Name = "TenHDT",
				Width = (int)((dtgvData.Width - dtgvData.RowHeadersWidth)*((double)1/5))
			};
			dtgvData.Columns.Add(objColumn);
			objColumn = new DataGridViewTextBoxColumn
			{
				HeaderText = "Khóa học",
				DataPropertyName = "TenKH",
                Name = "TenKH",
				Width = (int)((dtgvData.Width - dtgvData.RowHeadersWidth)*((double)1/5)) - 2
			};
			dtgvData.Columns.Add(objColumn);
		}

		public void InitHiddenFields()
		{
			txtMaCN = new DevComponents.DotNetBar.Controls.TextBoxX
			{
				Name = "txtMaCN",
				Text = ""
			};
			txtMaCN.Visible = false;
			txtMaHDT = new DevComponents.DotNetBar.Controls.TextBoxX
			{
				Name = "txtMaHDT",
				Text = ""
			};
			txtMaHDT.Visible = false;
			txtMaKH = new DevComponents.DotNetBar.Controls.TextBoxX
			{
				Name = "txtMaKH",
				Text = ""
			};
			txtMaKH.Visible = false;
		}

		private void LoadData()
		{
			var dt = new DataTable();
			dt.Columns.Add("MSSV");
            dt.Columns.Add("HoTen");
            dt.Columns.Add("TenCN");
			dt.Columns.Add("TenHDT");
			dt.Columns.Add("TenKH");
            if (this.MaKhoa != -1)
            {
                var lstItem = SinhVienRepository.SelectByMaKhoa(this.MaKhoa);
                for (int i = 0; i < lstItem.Count; i++)
                {
                    dt.Rows.Add(lstItem[i].MSSV, lstItem[i].HoTen, lstItem[i].ChuyenNganh.TenCN, lstItem[i].HeDaoTao.TenHDT, lstItem[i].KhoaHoc.TenKH);
                }
            }
            else
            {
                dt.Rows.Add(m_SinhVien.MSSV, m_SinhVien.HoTen, m_SinhVien.ChuyenNganh.TenCN, m_SinhVien.HeDaoTao.TenHDT, m_SinhVien.KhoaHoc.TenKH);
            }
			DataView objTimeSheetDV = new System.Data.DataView(dt);
			objTimeSheetDV.AllowNew = false;
			dtgvData.AutoGenerateColumns = false;
			dtgvData.DataSource = objTimeSheetDV;
			dtgvData.ClearSelection();
		}

		private bool ValidateInput(EnumUpdateMode mode, ref string errorText)
		{
			if (mode == EnumUpdateMode.UPDATE || mode == EnumUpdateMode.DELETE)
			{
				if (txtMSSV.Text == "")
				{
					errorText = "Vui lòng chọn MSSV";
					return false;
				}
			}
			if (mode != EnumUpdateMode.DELETE)
			{
				if (txtMSSV.Text == "")
				{
					 errorText = "Vui lòng nhập MSSV";
					return false;
				}
				if (txtMaCN.Text == "")
				{
					 errorText = "Vui lòng chọn chuyên ngành";
					return false;
				}
				if (txtMaHDT.Text == "")
				{
					 errorText = "Vui lòng chọn hệ đào tạo";
					return false;
				}
				if (txtMaKH.Text == "")
				{
					 errorText = "Vui lòng chọn khóa học";
					return false;
				}
				if (txtHoTen.Text == "")
				{
					 errorText = "Vui lòng nhập họ tên";
					return false;
				}
			}
			return true;
		}

		private bool ActionAdd()
		{
			try
			{
				var item = new SinhVien
				{
					MSSV = txtMSSV.Text,
					MaCN = int.Parse(txtMaCN.Text),
					MaHDT = int.Parse(txtMaHDT.Text),
					MaKH = int.Parse(txtMaKH.Text),
					HoTen = txtHoTen.Text,
					NoiSinh = txtNoiSinh.Text,
					GioiTinh = cbxGioiTinh.SelectedIndex == 0 ? true : false,
					HKTT = txtHKTT.Text,
					KyTucXa = cbxKyTucXa.SelectedIndex == 0 ? true : false,
				};
                if (dtNgaySinh.Value != DateTime.MinValue)
                {
                    item.NgaySinh = dtNgaySinh.Value;
                }
                if (openFileDialog1.FileName != string.Empty && openFileDialog1.FileName != "openFileDialog1" && openFileDialog1.CheckPathExists)
				{
					item.Anh = FileHelpers.ReadFile(openFileDialog1.FileName);
				}
				else
				{
					item.Anh = null;
				}
				if (!SinhVienRepository.Insert(item))
				{
					return false;
				}
				return true;
			}
			catch
			{
				return false;
			}
		}

		private bool ActionUpdate()
		{
			try
			{
				var item = SinhVienRepository.SelectByID(txtMSSV.Text);
				item.MSSV = txtMSSV.Text;
				item.MaCN = int.Parse(txtMaCN.Text);
				item.MaHDT = int.Parse(txtMaHDT.Text);
				item.MaKH = int.Parse(txtMaKH.Text);
				item.HoTen = txtHoTen.Text;
				item.NoiSinh = txtNoiSinh.Text;
				item.GioiTinh = cbxGioiTinh.SelectedIndex == 0 ? true : false;
				item.HKTT = txtHKTT.Text;
				item.KyTucXa = cbxKyTucXa.SelectedIndex == 0 ? true : false;

                if (dtNgaySinh.Value != DateTime.MinValue)
                {
                    item.NgaySinh = dtNgaySinh.Value;
                }

                if (openFileDialog1.FileName != string.Empty && openFileDialog1.FileName != "openFileDialog1" && openFileDialog1.CheckPathExists)
                {
                    item.Anh = FileHelpers.ReadFile(openFileDialog1.FileName);
                }
				else
				{
					item.Anh = null;
				}
				return SinhVienRepository.Save();
			}
			catch
			{
				return false;
			}
		}

		private bool ActionDelete()
		{
			try
			{
				return SinhVienRepository.Delete(txtMSSV.Text);
			}
			catch
			{
				return false;
			}
		}

		public void TransferDataInfo(object sender, TransferSimpleDataEvent e)
		{
			this.Close();
			this.Handler(this, e);
		}

		private void btnChonChuyenNganh_Click(object sender, EventArgs e)
		{
			FrmQuanLyChuyenNganh frm = new FrmQuanLyChuyenNganh(this.MaKhoa, true);
			frm.Handler += GetChuyenNganh;
			frm.ShowDialog();
		}

		public void GetChuyenNganh(object sender, EventArgs e)
		{
			var eventType = (TransferSimpleDataEvent)e;
			string[] comp = eventType.Data.Split(new char[] { '#' });
			txtMaCN.Text = comp[0];
			txtChuyenNganh.Text = comp[1];
		}

		private void btnChonHeDaoTao_Click(object sender, EventArgs e)
		{
			FrmQuanLyHeDaoTao frm = new FrmQuanLyHeDaoTao(true);
			frm.Handler += GetHeDaoTao;
			frm.ShowDialog();
		}

		public void GetHeDaoTao(object sender, EventArgs e)
		{
			var eventType = (TransferSimpleDataEvent)e;
			string[] comp = eventType.Data.Split(new char[] { '#' });
			txtMaHDT.Text = comp[0];
			txtHeDaoTao.Text = comp[1];
		}

		private void btnChonKhoaHoc_Click(object sender, EventArgs e)
		{
			FrmQuanLyKhoaHoc frm = new FrmQuanLyKhoaHoc(true);
			frm.Handler += GetKhoaHoc;
			frm.ShowDialog();
		}

		public void GetKhoaHoc(object sender, EventArgs e)
		{
			var eventType = (TransferSimpleDataEvent)e;
			string[] comp = eventType.Data.Split(new char[] { '#' });
			txtMaKH.Text = comp[0];
			txtKhoaHoc.Text = comp[1];
		}


		private void btnChonAnh_Click(object sender, EventArgs e)
		{
			if (openFileDialog1.ShowDialog() == DialogResult.OK)
			{
				ptbAnh.Image = new Bitmap(openFileDialog1.FileName);
			}
		}

		private void btnXoaAnh_Click(object sender, EventArgs e)
		{
			ptbAnh.Image = null;
		}

        private void toolStripButton1_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void btnXemDiemHocTap_Click(object sender, EventArgs e)
        {
            if (dtgvData.SelectedRows.Count > 0)
            {
                FrmDiemTongHopSV frm = new FrmDiemTongHopSV(dtgvData.SelectedRows[0].Cells["MSSV"].Value.ToString());
                frm.ShowDialog();
            }
        }

        private void btnThoat_Click(object sender, EventArgs e)
        {
            this.Close();
        }
	}

}
